package com.xiguanlezz.cn.common;

import com.xiguanlezz.cn.util.JsonUtil;
import io.netty.buffer.ByteBuf;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import java.nio.charset.Charset;

/**
 * @Author：习惯了种种
 * @CreateDate：2024/10/16 22:25
 * @Description：消息的父类
 */
@ToString
@Setter
@Getter
public abstract class Message<T extends MessageBody> {
    // 消息头
    private MessageHeader messageHeader;
    // 消息体
    private T messageBody;

    public void encode(ByteBuf buf) {
        buf.writeInt(messageHeader.getVersion());
        buf.writeInt(messageHeader.getOpType());
        buf.writeLong(messageHeader.getMsgId());
        buf.writeBytes(JsonUtil.toJson(messageBody).getBytes());
    }

    public void decode(ByteBuf buf) {
        int version = buf.readInt();
        int opType = buf.readInt();
        long msgId = buf.readLong();
        messageHeader = new MessageHeader(version, opType, msgId);
        // 将剩下的ByteBuf直接反序列化
        // 注意：ByteBuf.toString()并不会读取ByteBuf中的数据，更像是打印对象当前的快照信息
        T body = JsonUtil.fromJson(buf.toString(Charset.forName("UTF-8")), getMessageBodyClass(opType));
        messageBody = body;
    }

    protected abstract Class<T> getMessageBodyClass(int opType);
}
